
#ifndef __RTL8712_HAL_H__
#define __RTL8712_HAL_H__



enum _HW_VERSION {

	RTL8712_FPGA,
	RTL8712_1stCUT,//A Cut (RTL8712_ASIC)
	RTL8712_2ndCUT,//B Cut
	RTL8712_3rdCUT,//C Cut
};


enum _LOOPBACK_TYPE {

 RTL8712_AIR_TRX = 0,
 RTL8712_MAC_LBK,
 RTL8712_BB_LBK,
 RTL8712_MAC_FW_LBK = 4,
 RTL8712_BB_FW_LBK = 8,

};

enum RTL871X_HCI_TYPE {

	RTL8712_SDIO,	
	RTL8712_USB,
};

enum RTL8712_RF_CONFIG{
	RTL8712_RF_1T1R,
	RTL8712_RF_1T2R,
	RTL8712_RF_2T2R
};


enum _RTL8712_HCI_TYPE_{
 RTL8712_HCI_TYPE_PCIE=0x01,
 RTL8712_HCI_TYPE_AP_PCIE=0x81,  
 RTL8712_HCI_TYPE_USB=0x02,
 RTL8712_HCI_TYPE_92USB=0x02,
 RTL8712_HCI_TYPE_AP_USB=0x82,   
 RTL8712_HCI_TYPE_72USB=0x12,
 RTL8712_HCI_TYPE_SDIO=0x04,
 RTL8712_HCI_TYPE_72SDIO=0x14
};


struct fw_priv {   //8-bytes alignment required

	//--- long word 0 ----
 unsigned char  signature_0;  //0x12: CE product, 0x92: IT product
 unsigned char  signature_1;  //0x87: CE product, 0x81: IT product
 unsigned char  hci_sel;   //0x81: PCI-AP, 01:PCIe, 02: 92S-U, 0x82: USB-AP, 0x12: 72S-U, 03:SDIO
 unsigned char  chip_version; //the same value as reigster value 
 unsigned char  customer_ID_0; //customer  ID low byte
 unsigned char  customer_ID_1; //customer  ID high byte
 unsigned char  rf_config;  //0x11:  1T1R, 0x12: 1T2R, 0x92: 1T2R turbo, 0x22: 2T2R
 unsigned char  usb_ep_num;  // 4: 4EP, 6: 6EP, 11: 11EP
	
	//--- long word 1 ----
 unsigned char  regulatory_class_0; //regulatory class bit map 0
 unsigned char  regulatory_class_1; //regulatory class bit map 1
 unsigned char  regulatory_class_2; //regulatory class bit map 2
 unsigned char  regulatory_class_3; //regulatory class bit map 3 
 unsigned char  rfintfs;    // 0:SWSI, 1:HWSI, 2:HWPI
 unsigned char  def_nettype;  //
 unsigned char  turboMode;
 unsigned char  lowPowerMode;// 0: noral mode, 1: low power mode
	
	//--- long word 2 ----
 unsigned char  lbk_mode; //0x00: normal, 0x03: MACLBK, 0x01: PHYLBK
 unsigned char  mp_mode; // 1: for MP use, 0: for normal driver (to be discussed)
 unsigned char  vcsType; /* 0:off 1:on 2:auto */
 unsigned char  vcsMode; /* 1:RTS/CTS 2:CTS to self */
 unsigned char  rsvd022;
 unsigned char  rsvd023;
 unsigned char  rsvd024;
 unsigned char  rsvd025;
	
	//--- long word 3 ----
 unsigned char  qos_en;    //1: QoS enable
 unsigned char  bw_40MHz_en;   //1: 40MHz BW enable
 unsigned char  AMSDU2AMPDU_en;   //1: 4181 convert AMSDU to AMPDU, 0: disable
 unsigned char  AMPDU_en;   //1: 11n AMPDU enable
 unsigned char  rate_control_offload;  //1: FW offloads, 0: driver handles
 unsigned char  aggregation_offload;  //1: FW offloads, 0: driver handles
 unsigned char  rsvd030;
 unsigned char  rsvd031;

	//--- long word 4 ----
 unsigned char  beacon_offload;   // 1. FW offloads, 0: driver handles
 unsigned char  MLME_offload;   // 2. FW offloads, 0: driver handles
 unsigned char  hwpc_offload;   // 3. FW offloads, 0: driver handles
 unsigned char  tcp_checksum_offload; // 4. FW offloads, 0: driver handles
 unsigned char  tcp_offload;    // 5. FW offloads, 0: driver handles
 unsigned char  ps_control_offload;  // 6. FW offloads, 0: driver handles
 unsigned char  WWLAN_offload;   // 7. FW offloads, 0: driver handles
 unsigned char  rsvd040;

	//--- long word 5 ----
 unsigned char  tcp_tx_frame_len_L;  //tcp tx packet length low byte
 unsigned char  tcp_tx_frame_len_H;  //tcp tx packet length high byte
 unsigned char  tcp_rx_frame_len_L;  //tcp rx packet length low byte
 unsigned char  tcp_rx_frame_len_H;  //tcp rx packet length high byte
 unsigned char  rsvd050;
 unsigned char  rsvd051;
 unsigned char  rsvd052;
 unsigned char  rsvd053;
	
};


struct fw_hdr{//8-byte alinment required

	unsigned short	signature;//
	unsigned short	version;//0x8000 ~ 0x8FFF for FPGA version,	//0x0000 ~ 0x7FFF for ASIC version,
	
	unsigned int		dmem_size;    //define the size of boot loader

	unsigned int		img_IMEM_size;    //define the size of FW in IMEM
	
	unsigned int		img_SRAM_size;    //define the size of FW in SRAM

	unsigned int		fw_priv_sz;       //define the size of DMEM variable 
	
	unsigned short	efuse_addr;
	unsigned short 	h2ccnd_resp_addr;
	
	unsigned short	debug_dump_addr;
	unsigned short	rsvd1;
	
	unsigned int  		release_time; //Mon:Day:Hr:Min

	struct fw_priv 	fwpriv;	
	
};

struct hal_priv{

	//Endpoint handles
	_nic_hdl	pipehdls_r8712[10];
	
	u8 (*hal_bus_init)(_adapter *adapter);
	u8  (*hal_bus_deinit)(_adapter *adapter);
	
};

uint	 rtl8712_hal_init(_adapter *padapter);

#endif
